home *** CD-ROM | disk | FTP | other *** search
- /* $Revision Header *** Header built automatically - do not edit! ***********
- *
- * (C) Copyright 1990 by MXM
- *
- * Name .....: LibMain.c
- * Created ..: Saturday 06-Jan-90 23:30
- * Revision .: 8
- *
- * Date Author Comment
- * ========= ======== ====================
- * 01-Apr-90 Olsen Rework for Aztec 5.0
- * 25-Jan-90 Olsen Did some cleanups
- * 14-Jan-90 Olsen Renamed to mxm.library
- * 07-Jan-90 Olsen - Empty log message -
- * 07-Jan-90 Olsen Appended new functions
- * 06-Jan-90 Olsen - Empty log message -
- * 06-Jan-90 Olsen - Empty log message -
- * 06-Jan-90 Olsen Created this file!
- *
- * $Revision Header ********************************************************/
-
- /* Imported from MXM.c */
-
- extern LONG Revision;
-
- /* ASCII library ID. */
-
- char *LibName = "mxm.library";
- char *LibId = "mxm.library 34.14 (01 Apr 1990)\r\n";
-
- /* External data, defined in asm startup code. */
-
- extern struct Resident LibRomTag;
- extern LONG LibInit();
-
- /* Protos for this module. */
-
- struct MXMBase * LibMain(struct MXMBase *,BPTR);
- struct MXMBase * LibOpen(VOID);
- BPTR LibClose(VOID);
- BPTR LibExpunge(VOID);
-
- /* And now for the pragmas... */
-
- #pragma amicall(MXMBase,0x06,LibOpen())
- #pragma amicall(MXMBase,0x0C,LibClose())
- #pragma amicall(MXMBase,0x12,LibExpunge())
-
- /* The library initialization. */
-
- #pragma regcall(LibMain(d0,a0))
-
- /* The structure expected by the library loader (auto-init). */
-
- struct InitTable
- {
- ULONG it_DataSize; /* Data size to allocate. */
- APTR *it_FuncTable; /* Pointer to function table. */
- APTR it_DataInit; /* Pointer to data initializers (remember InitStruct()?). */
- APTR it_InitFunc; /* The real library init function. */
- };
-
- /* The list of library functions. */
-
- VOID *LibFuncTab[] =
- {
- LibOpen, /* Standard library routines. */
- LibClose,
- LibExpunge,
- NULL, /* Reserved, leave it NULL. */
-
- AllocRem,
- FreeRem,
- CreateFuncTask,
- DeleteFuncTask,
- CreateFuncProc,
- MovePointer,
- WriteConsole,
- DeletePrinterSupport,
- CreatePrinterSupport,
- StartPrinterDump,
- StopPrinterDump,
- DeleteTimer,
- CreateTimer,
- WaitForTimer,
- TimeDelay,
- KeyConvert,
- InvertKey,
- EraseGadget,
- RefreshGadget,
- GetLongInt,
- SetLongInt,
- GetGadgetString,
- SetGadgetString,
- GetToggleGadget,
- SetToggleGadget,
- SetWaitPointer,
- PopRequest,
- PopMenu,
- Announce,
- CheckSumCRC,
- CheckSumSimple,
- CryptBlock,
- IsASCII,
- IsPrintable,
- ToUpper,
- UStrCmp,
- Random,
- FindFileWindow,
- DeleteHiddenRPort,
- CreateHiddenRPort,
- EnableWindow,
- DisableWindow,
-
- (VOID *)-1 /* End marker. */
- };
-
- /* The romtag needs this. */
-
- struct InitTable LibInitTab =
- {
- (ULONG)sizeof(struct MXMBase), /* Lib base. */
- (APTR)LibFuncTab, /* Function table. */
- NULL, /* No data init table (we'll do autoinit). */
- (APTR)LibInit /* Lib init routine. */
- };
-
- /* Library auxilary data. */
-
- struct IOStdReq *kc_ConStdReq;
- struct KeyEquivalent *EquList;
- struct KeyMap *ik_KeyMap;
- struct SignalSemaphore *PopSemaphore;
-
- /* The libraries this library needs. */
-
- APTR IntuitionBase;
- APTR GfxBase;
- APTR LayersBase;
- APTR DOSBase;
- APTR ConsoleDevice;
-
- /* Global segment list (we only need one). */
-
- BPTR LibSegList = ZERO;
-
- /* LibMain(MXMBase,SegList):
- *
- * Does the main library initialization, expects
- * arguments in registers.
- */
-
- struct MXMBase *
- LibMain(MXMBase,SegList)
- struct MXMBase *MXMBase;
- BPTR SegList;
- {
- /* We don't wish to be initialized twice,
- * the check for LibSegList will hopefully
- * insure this.
- */
-
- if(!LibSegList)
- {
- /* Remember segment list. */
-
- LibSegList = SegList;
-
- /* Try to open the required libraries. */
-
- if(!(IntuitionBase = (APTR)OpenLibrary("intuition.library",LIBRARY_MINIMUM)))
- goto Failed;
-
- if(!(GfxBase = (APTR)OpenLibrary("graphics.library",LIBRARY_MINIMUM)))
- goto Failed;
-
- if(!(LayersBase = (APTR)OpenLibrary("layers.library",LIBRARY_MINIMUM)))
- goto Failed;
-
- if(!(DOSBase = (APTR)OpenLibrary("dos.library",LIBRARY_MINIMUM)))
- goto Failed;
-
- if(!(kc_ConStdReq = (struct IOStdReq *)AllocMem(sizeof(struct IOStdReq),MEMF_PUBLIC | MEMF_CLEAR)))
- goto Failed;
-
- if(OpenDevice("console.device",-1,kc_ConStdReq,0))
- goto Failed;
-
- if(!(EquList = (struct KeyEquivalent *)AllocMem(sizeof(struct KeyEquivalent) * 94,MEMF_PUBLIC | MEMF_CLEAR)))
- goto Failed;
-
- if(!(ik_KeyMap = (struct KeyMap *)AllocMem(sizeof(struct KeyMap),MEMF_PUBLIC | MEMF_CLEAR)))
- goto Failed;
-
- if(!(PopSemaphore = (struct SignalSemaphore *)AllocMem(sizeof(struct SignalSemaphore),MEMF_PUBLIC | MEMF_CLEAR)))
- goto Failed;
-
- InitSemaphore(PopSemaphore);
-
- ConsoleDevice = (APTR)kc_ConStdReq -> io_Device;
-
- /* Fill in the library head. */
-
- MXMBase -> LibNode . lib_Node . ln_Type = NT_LIBRARY;
- MXMBase -> LibNode . lib_Node . ln_Name = LibName;
- MXMBase -> LibNode . lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
- MXMBase -> LibNode . lib_Version = LibRomTag . rt_Version;
- MXMBase -> LibNode . lib_Revision = Revision;
- MXMBase -> LibNode . lib_IdString = (APTR)LibId;
-
- MXMBase -> IntuitionBase = IntuitionBase;
- MXMBase -> GfxBase = GfxBase;
- MXMBase -> LayersBase = LayersBase;
- MXMBase -> DOSBase = DOSBase;
- MXMBase -> ConsoleDevice = ConsoleDevice;
-
- return(MXMBase);
-
- Failed: if(IntuitionBase)
- CloseLibrary(IntuitionBase);
-
- if(GfxBase)
- CloseLibrary(GfxBase);
-
- if(LayersBase)
- CloseLibrary(LayersBase);
-
- if(ConsoleDevice)
- CloseDevice(kc_ConStdReq);
-
- if(DOSBase)
- CloseLibrary(DOSBase);
-
- if(EquList)
- FreeMem(EquList,sizeof(struct KeyEquivalent) * 94);
-
- if(kc_ConStdReq)
- FreeMem(kc_ConStdReq,sizeof(struct IOStdReq));
-
- if(ik_KeyMap)
- FreeMem(ik_KeyMap,sizeof(struct KeyMap));
-
- if(PopSemaphore)
- FreeMem(PopSemaphore,sizeof(struct SignalSemaphore));
-
- LibSegList = ZERO;
-
- return(NULL);
- }
- }
-
- /* LibOpen():
- *
- * Library open routine.
- */
-
- struct MXMBase *
- LibOpen()
- {
- struct MXMBase *MXMBase;
-
- /* Check if everything is in good shape. */
-
- if(!IntuitionBase || !GfxBase || !LayersBase || !DOSBase || !ConsoleDevice || !EquList || !kc_ConStdReq || !ik_KeyMap)
- return(NULL);
-
- /* Increment open count. */
-
- MXMBase -> LibNode . lib_OpenCnt++;
- MXMBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
-
- /* Return base pointer. */
-
- return(MXMBase);
- }
-
- /* LibClose():
- *
- * Closes the library.
- */
-
- BPTR
- LibClose()
- {
- struct MXMBase *MXMBase;
- BPTR SegList = ZERO;
-
- /* Time for an expunge? */
-
- if(MXMBase -> LibNode . lib_OpenCnt > 0)
- {
- MXMBase -> LibNode . lib_OpenCnt--;
-
- SegList = LibExpunge();
- }
- else
- Alert(AT_Recovery | AG_CloseLib,"MXM");
-
- return(SegList);
- }
-
- /* LibExpunge(MXMBase):
- *
- * Expunge library, careful: this can be called by
- * ramlib while the rest of the library doesn't know
- * about it.
- */
-
- BPTR
- LibExpunge()
- {
- struct MXMBase *MXMBase;
- BPTR SegList = ZERO;
-
- /* Is user count zero, the delayed expunge flag
- * set and the library seglist valid?
- */
-
- if(MXMBase -> LibNode . lib_OpenCnt == 0 && (MXMBase -> LibNode . lib_Flags & LIBF_DELEXP) && LibSegList)
- {
- /* Remember segment list. */
-
- SegList = LibSegList;
-
- LibSegList = ZERO;
-
- /* Remove library from lib list. */
-
- Remove((struct Node *)MXMBase);
-
- /* Some paranoid action. */
-
- MXMBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
-
- /* Close what we've opened. */
-
- if(IntuitionBase)
- CloseLibrary(IntuitionBase);
-
- if(GfxBase)
- CloseLibrary(GfxBase);
-
- if(LayersBase)
- CloseLibrary(LayersBase);
-
- if(ConsoleDevice)
- CloseDevice(kc_ConStdReq);
-
- if(DOSBase)
- CloseLibrary(DOSBase);
-
- if(EquList)
- FreeMem(EquList,sizeof(struct KeyEquivalent) * 94);
-
- if(kc_ConStdReq)
- FreeMem(kc_ConStdReq,sizeof(struct IOStdReq));
-
- if(ik_KeyMap)
- FreeMem(ik_KeyMap,sizeof(struct KeyMap));
-
- if(PopSemaphore)
- FreeMem(PopSemaphore,sizeof(struct SignalSemaphore));
-
- /* Free library mem. */
-
- FreeMem((char *)MXMBase - MXMBase -> LibNode . lib_NegSize,MXMBase -> LibNode . lib_NegSize + MXMBase -> LibNode .lib_PosSize);
- }
- else
- {
- /* In any other case we'll set the delayed
- * expunge flag (so next expunge call will
- * hopefully wipe us from the lib list.
- */
-
- MXMBase -> LibNode . lib_Flags |= LIBF_DELEXP;
- }
-
- /* Return segment list pointer. */
-
- return(SegList);
- }
-